'use strict';

const Controller = require('egg').Controller;

/**
 * 投稿数据控制器
 * 处理投稿数据相关功能
 */
class ContributionDataController extends Controller {
  /**
   * 获取待补充数据的投稿列表
   * 返回已审核但缺少平台数据的投稿
   */
  async getPendingDataList() {
    const {
      ctx
    } = this;
    const result = await ctx.service.contributionData.getPendingDataList();
    ctx.body = result;
  }

  /**
   * 导入平台数据
   * @param {Object} ctx.request.body
   * @param {number} ctx.request.body.contribution_id - 投稿ID
   * @param {number|string} [ctx.request.body.tiktok_likes] - 抖音点赞数
   * @param {number|string} [ctx.request.body.channels_views] - 视频号播放量
   * @param {number|string} [ctx.request.body.channels_likes] - 视频号点赞数
   * @param {string} ctx.request.body.platform_submit_date - 平台提交日期（格式：YYYY/MM/DD）
   * @throws {404} 投稿不存在时抛出异常
   * @throws {422} 投稿未审核通过或参数无效时抛出异常
   */
  async importPlatformData() {
    const {
      ctx
    } = this;
    // 验证参数（新增 platform_submit_date 验证）
    ctx.validate({
      contribution_id: {
        type: 'number',
        required: true
      },
      platform_submit_date: {
        type: 'string',
        required: true,
        format: /^\d{4}\/\d{2}\/\d{2}$/, // 验证格式为 YYYY/MM/DD
        message: '平台提交日期格式必须为 YYYY/MM/DD'
      }
    });

    // 处理平台数据，非数字类型则置为0
    const data = {
      contribution_id: ctx.request.body.contribution_id,
      tiktok_likes: this.normalizeNumber(ctx.request.body.tiktok_likes),
      channels_views: this.normalizeNumber(ctx.request.body.channels_views),
      channels_likes: this.normalizeNumber(ctx.request.body.channels_likes),
      platform_submit_date: ctx.request.body.platform_submit_date // 新增参数传递
    };

    const result = await ctx.service.contributionData.importPlatformData(data);

    if (!result) {
      ctx.throw(404, '未找到该投稿');
    }
    if (result.error === 'not_approved') {
      ctx.throw(422, '该投稿未审核通过');
    }
    if (result.error === 'invalid_date_format') {
      ctx.throw(422, '平台提交日期格式无效（必须为 YYYY/MM/DD）');
    }
    if (result.error === 'invalid_date') {
      ctx.throw(422, '平台提交日期为无效日期');
    }

    ctx.body = result;
  }

  /**
   * 规范化数字
   * 非数字或负数返回0
   * @param {any} value - 输入值
   * @returns {number} 规范化后的数字
   */
  normalizeNumber(value = 0) {
    const num = Number(value);
    return (!isNaN(num) && num >= 0) ? num : 0;
  }

  /**
   * 获取投稿统计列表
   * 支持多条件筛选，不分页
   * @param {Object} ctx.request.body
   * @param {string} [ctx.request.body.start_date] - 开始日期，格式：YYYY-MM-DD
   * @param {string} [ctx.request.body.end_date] - 结束日期，格式：YYYY-MM-DD
   * @param {number} [ctx.request.body.project_group_id] - 项目组ID
   * @param {number} [ctx.request.body.department_id] - 部门ID
   * @param {string} [ctx.request.body.person_name] - 人员姓名，模糊匹配
   * @param {number} [ctx.request.body.approved_status] - 审核状态（0:未审核，1:通过，2:驳回）
   * @param {0|1|2} [ctx.request.body.has_platform_submit_date] - 平台提交日期筛选（0:所有, 1:有值, 2:无值）
   */
  async getStatsList() {
    const {
      ctx
    } = this;
    // 验证参数（更新 has_platform_submit_date 规则）
    ctx.validate({
      start_date: {
        type: 'string',
        required: false,
        format: /^\d{4}-\d{2}-\d{2}$/
      },
      end_date: {
        type: 'string',
        required: false,
        format: /^\d{4}-\d{2}-\d{2}$/
      },
      project_group_id: {
        type: 'number',
        required: false
      },
      department_id: {
        type: 'number',
        required: false
      },
      person_name: {
        type: 'string',
        required: false
      },
      approved_status: {
        type: 'number',
        required: false,
        min: 0,
        max: 2
      },
      // 更新：平台提交日期筛选（0=所有，1=有值，2=无值）
      has_platform_submit_date: {
        type: 'number',
        required: false,
        min: 0,
        max: 2,
        message: 'has_platform_submit_date 必须为 0、1 或 2'
      }
    });

    // 将参数传递给 Service 层
    const result = await ctx.service.contributionData.getStatsList(ctx.request.body);
    ctx.body = result;
  }

  /**
   * 获取投稿概览统计
   * 统计各种状态的投稿数量
   * @param {Object} ctx.request.body
   * @param {string} [ctx.request.body.start_date] - 开始日期，格式：YYYY-MM-DD
   * @param {string} [ctx.request.body.end_date] - 结束日期，格式：YYYY-MM-DD
   */
  async getOverview() {
    const {
      ctx
    } = this;
    // 验证参数
    ctx.validate({
      start_date: {
        type: 'string',
        required: false,
        format: /^\d{4}-\d{2}-\d{2}$/
      },
      end_date: {
        type: 'string',
        required: false,
        format: /^\d{4}-\d{2}-\d{2}$/
      }
    });

    const result = await ctx.service.contributionData.getOverview(ctx.request.body);
    ctx.body = result;
  }
}

module.exports = ContributionDataController;